package com.example.aijava.service;

import com.example.aijava.dto.*;
import com.example.aijava.exception.UserAlreadyExistsException;
import com.example.aijava.model.User;
import com.example.aijava.repository.UserRepository;
import com.example.aijava.util.JwtUtil;
import org.mindrot.jbcrypt.BCrypt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;

@Service
public class UserService {

    //  保留原有依赖注入（JwtUtil 用于生成令牌，UserRepository 用于数据库操作）
    private final UserRepository userRepository;
    private final JwtUtil jwtUtil;

    @Autowired
    public UserService(UserRepository userRepository, JwtUtil jwtUtil) {
        this.userRepository = userRepository;
        this.jwtUtil = jwtUtil;
    }
    // ====================== 用户认证相关方法 ======================
    // 注册方法（保留原有校验逻辑，整合显式赋值+时间设置）
    public User register(RegisterRequest request) {
        // 1. 用户名/邮箱重复校验（避免重复注册）
        if (userRepository.existsByUsername(request.getUsername())) {
            throw new UserAlreadyExistsException("用户名已存在");
        }
        if (userRepository.existsByEmail(request.getEmail())) {
            throw new UserAlreadyExistsException("邮箱已被注册");
        }

        // 2. ：密码BCrypt加密（安全存储，不存明文）
        String encryptedPassword = BCrypt.hashpw(request.getPassword(), BCrypt.gensalt());

        // 3.构建用户对象：显式构建User对象（不依赖构造函数，更灵活）
        User user = new User(); // 无参构造创建对象
        user.setUsername(request.getUsername()); // 显式设置用户名
        user.setPassword(encryptedPassword); // 显式设置加密密码
        user.setEmail(request.getEmail()); // 显式设置邮箱
        user.setCreatedAt(LocalDateTime.now());

        // 4. 存入数据库并返回
        return userRepository.save(user);
    }

    // 登录方法（校验用户+生成JWT令牌）
    public String login(LoginRequest request) {
        // 根据用户名查询用户（不存在则抛异常）
        User user = userRepository.findByUsername(request.getUsername())
                .orElseThrow(() -> new IllegalArgumentException("用户名或密码错误"));

        // 校验密码（BCrypt比对明文与加密密码）
        if (!BCrypt.checkpw(request.getPassword(), user.getPassword())) {
            throw new IllegalArgumentException("用户名或密码错误");
        }

        // 生成JWT令牌（用用户名作为载荷）
        return jwtUtil.generateToken(user.getUsername());
    }

    // 获取用户信息方法（用于登录后返回用户资料）
    public User getProfile(String username) {
        // 根据用户名查询用户（不存在则抛异常）
        return userRepository.findByUsername(username)
                .orElseThrow(() -> new IllegalArgumentException("用户不存在"));
    }


}